我们在开发中,UI经常需要使用到动画:animation 英 ænɪ’meɪʃ(ə)n 。下面介绍几种常见的动画。
乾言:duration是指动画的时间,FillEnable = false 时,FillBefore 和FillAfter的值将被忽略不起作用.
一,补间动画 Tweened animation
alpha,透明度变化,fromAlpha toAlpha,xml文件:R.anim.anim_alpha如下:
1 2 3 4 5 6 7 8 9 10
| <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillEnabled="true" android:fillAfter="true"> <alpha android:fromAlpha="1.0" android:toAlpha="0.5" android:duration="2000" /> </set>
|
scale,缩放,fromXScale toXScale 水平方向缩放比例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillEnabled="true" android:fillAfter="true"> <!--使动画保持在播放的最后一帧,必须加在<set>标签这里才起作用--> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="0.5" android:fromYScale="1.0" android:toYScale="0.5" android:pivotX="50%" android:pivotY="50%" android:duration="2000" /> </set>
|
translate,位移,垂直方向位移变化,fromYDelta toYDlta
1 2 3 4 5 6 7 8 9 10
| <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillEnabled="true" android:fillAfter="true"> <translate android:fromXDelta="10" android:toXDelta="100" android:fromYDelta="10" android:toYDelta="100" /> </set>
|
rotate,旋转,角度变化。fromDegrees,toDegress
1 2 3 4 5 6 7 8 9 10 11 12 13
| <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillEnabled="true" android:fillAfter="true"> <!--pivotX pivotY 旋转的中心点。(0.5f,0.5f)表示View本身的中心 --> <rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:duration="2000" /> </set>
|
动画集:多个Tween动画连起来成为动画集。
1 2 3 4 5 6 7 8 9 10 11 12 13
| private void startAnimation() { Animation alphaAnimation = AnimationUtils.loadAnimation(mContext, R.anim.anim_alpha); Animation scaleAnimation = AnimationUtils.loadAnimation(mContext, R.anim.anim_scale); Animation rotateAnimation = AnimationUtils.loadAnimation(mContext, R.anim.anim_rotate); AnimationSet set = new AnimationSet(true); set.addAnimation(alphaAnimation); set.addAnimation(scaleAnimation); set.addAnimation(rotateAnimation); set.setDuration(1400); iv_splash_circle.startAnimation(set); }
|
在代码中实现动画
只要用对应的API即可,例如:
1 2 3 4 5 6 7 8 9 10 11
| AnimationSet animationSet = new AnimationSet(true); AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0); alphaAnimation.setDuration(1000); animationSet.addAnimation(alphaAnimation); view.startAnimation(animationSet);
|
帧动画 Frame by frame animation
一个画面就是一个frame,就像flash中的帧动画一样,将每个帧连起来的动画,就像gif图片一样的效果。
逐帧动画其实很简单,下面我们来看一个例子:
xml布局文件:R.drawable.animation。
1 2 3 4 5 6 7 8
| <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true" > <item android:drawable="@drawable/icon1" android:duration="150"/> <item android:drawable="@drawable/icon2" android:duration="150"/> <item android:drawable="@drawable/icon3" android:duration="150"/> </animation-list>
|
将三张图片连起来。可以在ImageView中直接引入Drawable,也可以在代码中引用。
1 2
| AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable(); animationDrawable.start();
|
注:常见的动画插入器
Interpolator属性是Animation类的一个XML属性,alpha、scale、rotate、translate、set都会继承得到这个属性。
accelerate_decelerate_interpolator
加速-减速 动画插入器
accelerate_interpolator
加速-动画插入器
decelerate_interpolator
减速- 动画插入器
提供几个封装好的创建动画的方法:
/**
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public static void translateAnimation(View v,float fromXDelta,float toXDelta, float fromYDelta, float toYDelta,long durationMillis){ TranslateAnimation animation=new TranslateAnimation(fromXDelta,toXDelta,fromYDelta,toYDelta); animation.setDuration(durationMillis); animation.setFillAfter(true); v.startAnimation(animation); LogUtils.e("AnimationUtil", "TranslateAnimation"); } public static Animation createZoomInNearAnim() { AnimationSet ret; Animation anim; ret = new AnimationSet(false); anim = new AlphaAnimation(0f, 1f); anim.setDuration(MEDIUM); anim.setInterpolator(new LinearInterpolator()); ret.addAnimation(anim); anim = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setDuration(MEDIUM); anim.setInterpolator(new DecelerateInterpolator()); ret.addAnimation(anim); return ret; }
|
其他动画,属性动画,动画框架下次再总结。
欢迎与杜工交流:杜乾,Dusan,QQ291902259。